#!/bin/bash

#----------------------------基础知识----------------------------

# tr [options] set1 set2

# tr 只能通过 stdin （标准输入）
# 将来自 stdin 的输入字符从 set1 映射到 set2 ，然后将输出写入 stdout （标准输出）。 
# set1和 set2 是字符类或字符集。
# 如果两个字符集的长度不相等，那么 set2 会不断重复其最后一个字符，直到长度与 set1 相同。
# 如果 set2 的长度大于 set1 ，那么在 set2 中超出 set1 长度的那部分字符则全部被忽略。

# 将输入字符由大写转换成小写
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'

# 通过在 tr 中使用集合的概念，我们可以轻松地将字符从一个集合映射到另一个集合中。





# 用 tr 删除字符
# 选项 -d ，指定需要被删除的字符集合
# cat file.txt | tr -d '[set1]'
echo "Hello 123 world 456" | tr -d '0-9'




# 利用选项 -c 来使用 set1 的补集
# tr -c [set1] [set2]
# 最典型的用法是 从输入文本中 将不在集合中的所有字符 全部删除。
echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'




# -s 选项可以压缩输入中重复的字符，压缩成单个字符
# 如 压缩空白字符
# tr -s '[set]'
echo "GNU is    not       UNIX. Recursive  right ?" | tr -s ' '

cat <<EOF > sum.txt
1
2
3
4
5
6
EOF
cat sum.txt | echo $[ $(tr '\n' '+' ) 0 ]
rm -rf sum.txt
# 在上面的命令中， tr 用来将 '\n' 替换成 '+' ，因此我们得到了字符串 "1+2+3+…5+" ，
# 但是在字符串的尾部多了一个操作符 + , 为了抵消这个多出来的操作符，我们再追加一个 0
# $[ operation ] 执行算术运算

# 使用 tr ，以摈除多余的换行符
at multi_blanks.txt | tr -s '\n'
# tr 将多余的 '\n' 字符合并为单一的 '\n' （换行符）



# tr 可以像使用集合一样使用各种不同的字符类
# 这些字符类如下所示：
#       alnum ：字母和数字。
#       alpha ：字母。
#       cntrl ：控制（非打印）字符。
#       digit ：数字。
#       graph ：图形字符。
#       lower ：小写字母。
#       print ：可打印字符。
#       punct ：标点符号。
#       space ：空白字符。
#       upper ：大写字母。
#       xdigit ：十六进制字符。
# 可以按照下面的方式选择并使用所需的字符类：
# tr [:class:] [:class:]
tr '[:lower:]' '[:upper:]'

#----------------------------实战演练----------------------------


